package com.yc.mybatis.core;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.yc.mybatis.core.MyProperties;

public class DBHelper {
	static {
		//1、加载驱动 	一个应用程序只需要执行一次，而且，一开始就要执行		位置E:\Oracle\product\10.2.0\db_1\jdbc\lib
		//复制驱动包：右键项目 -> build path -> configure -> add jar
		try {		
			Class.forName(MyProperties.getInstance().getProperty("driver"));
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} 
	}
	
	//2、建立连接
	public Connection getCon() {
		Connection con = null;
		try {			
			con = DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return con;
	}
	
	//开始操作 	增删改是一个方法
	public int doUpdate(String sql,ArrayList params) {
		int result = 0;
		
		try {
			Connection con = getCon();
			//4、创建预处理语句对象
			PreparedStatement ps = con.prepareStatement(sql);
			//5、注入参数
			doParams(ps,params);
			//6、执行
			result = ps.executeUpdate();
			//7、关闭连接
			closeAll(con,ps,null);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	//重载
	//开始操作 	增删改是一个方法
		public int doUpdate(String sql,Object... params) {
			int result = 0;
			
			try {
				Connection con = getCon();
				//4、创建预处理语句对象
				PreparedStatement ps = con.prepareStatement(sql);
				//5、注入参数
				doParams(ps,params);
				//6、执行
				result = ps.executeUpdate();
				//7、关闭连接
				closeAll(con,ps,null);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
			return result;
		}

	//注入参数
	private void doParams(PreparedStatement ps, ArrayList params) {
		if( params != null && params.size() > 0) {
			//有值才注入参数
			for(int i = 0; i< params.size(); i++) {
				try {
					ps.setObject(i+1, params.get(i));
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	//重载
	//注入参数										//量词参数 只能放在最后
		private void doParams(PreparedStatement ps, Object... params) {
			if( params != null && params.length > 0) {
				//有值才注入参数
				for(int i = 0; i< params.length; i++) {
					try {
						ps.setObject(i+1, params[i]);
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
		
		//查询
		public ArrayList<Map<String,String>> find(String sql, Object... params){
			ArrayList<Map<String,String>> list = new ArrayList<>();
			
			try {
				Connection con = getCon();
				//4、创建预处理语句对象
				PreparedStatement ps = con.prepareStatement(sql);
				//5、注入参数
				doParams(ps,params);
				//6、执行
				ResultSet rs = ps.executeQuery();
				//如何将ResultSet 转换为 ArrayList
				//先得到这个表的所有字段
				ResultSetMetaData rsmd = rs.getMetaData();
				String[] columns = new String[rsmd.getColumnCount()];
				for(int i = 0; i<columns.length;i++) {
//					System.out.println( rsmd.getColumnName( i + 1));
					columns[i] = rsmd.getColumnName( i + 1);
				}
				
				//开始取值出来存
				while(rs.next() ) {
					Map<String,String> map = new HashMap<>();
					for(int i = 0;i<columns.length;i++) {
						map.put(columns[i].toLowerCase() , rs.getString( columns[i]));
					}
					//最后将map，添加到list中
					list.add(map);
				}
								
				//7、关闭连接
				closeAll(con,ps,rs);
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
			return list;
			
			
		}
		
		//查询
				public ArrayList<Map<String,String>> find(String sql, ArrayList params){
					ArrayList<Map<String,String>> list = new ArrayList<>();
					
					try {
						Connection con = getCon();
						//4、创建预处理语句对象
						PreparedStatement ps = con.prepareStatement(sql);
						//5、注入参数
						doParams(ps,params);
						//6、执行
						ResultSet rs = ps.executeQuery();
						//如何将ResultSet 转换为 ArrayList
						//先得到这个表的所有字段
						ResultSetMetaData rsmd = rs.getMetaData();
						String[] columns = new String[rsmd.getColumnCount()];
						for(int i = 0; i<columns.length;i++) {
//							System.out.println( rsmd.getColumnName( i + 1));
							columns[i] = rsmd.getColumnName( i + 1);
						}
						
						//开始取值出来存
						while(rs.next() ) {
							Map<String,String> map = new HashMap<>();
							for(int i = 0;i<columns.length;i++) {
								map.put(columns[i].toLowerCase() , rs.getString( columns[i]));
							}
							//最后将map，添加到list中
							list.add(map);
						}
										
						//7、关闭连接
						closeAll(con,ps,rs);
					} catch (SQLException e) {
						e.printStackTrace();
					}
					
					return list;
					
					
				} 
				
				public ArrayList<Map<String,Object>> findByBlob(String sql,  Object... params){
					ArrayList<Map<String,Object>> list = new ArrayList<>();
					
					try {
						Connection con = getCon();
						//4、创建预处理语句对象
						PreparedStatement ps = con.prepareStatement(sql);
						//5、注入参数
						doParams(ps,params);
						//6、执行
						ResultSet rs = ps.executeQuery();
						//如何将ResultSet 转换为 ArrayList
						//先得到这个表的所有字段
						ResultSetMetaData rsmd = rs.getMetaData();
						String[] columns = new String[rsmd.getColumnCount()];
						for(int i = 0; i<columns.length;i++) {
//							System.out.println( rsmd.getColumnName( i + 1));
							columns[i] = rsmd.getColumnName( i + 1);
						}
						
						//开始取值出来存
						while(rs.next() ) {
							Map<String,Object> map = new HashMap<>();
							for(int i = 0;i<columns.length;i++) {
								//区分其他的
								if( "oracle.sql.BLOB".equals(  rs.getObject(columns[i]).getClass().getName() ) ) {
									map.put(columns[i].toLowerCase() , rs.getBytes( columns[i]));	
								}else {
									map.put(columns[i].toLowerCase() , rs.getString( columns[i]));								
								}
							}
							//最后将map，添加到list中
							list.add(map);
						}
						//7、关闭连接
						closeAll(con,ps,rs);
					} catch (SQLException e) {
						e.printStackTrace();
					}			
					return list;			
				}
				
		public ArrayList<Map<String,Object>> findByBlob(String sql, ArrayList params){
			ArrayList<Map<String,Object>> list = new ArrayList<>();
			
			try {
				Connection con = getCon();
				//4、创建预处理语句对象
				PreparedStatement ps = con.prepareStatement(sql);
				//5、注入参数
				doParams(ps,params);
				//6、执行
				ResultSet rs = ps.executeQuery();
				//如何将ResultSet 转换为 ArrayList
				//先得到这个表的所有字段
				ResultSetMetaData rsmd = rs.getMetaData();
				String[] columns = new String[rsmd.getColumnCount()];
				for(int i = 0; i<columns.length;i++) {
//					System.out.println( rsmd.getColumnName( i + 1));
					columns[i] = rsmd.getColumnName( i + 1);
				}
				
				//开始取值出来存
				while(rs.next() ) {
					Map<String,Object> map = new HashMap<>();
					for(int i = 0;i<columns.length;i++) {
						//区分其他的
						if( "oracle.sql.BLOB".equals(  rs.getObject(columns[i]).getClass().getName() ) ) {
							map.put(columns[i].toLowerCase() , rs.getBytes( columns[i]));	
						}else {
							map.put(columns[i].toLowerCase() , rs.getString( columns[i]));								
						}
					}
					//最后将map，添加到list中
					list.add(map);
				}
				//7、关闭连接
				closeAll(con,ps,rs);
			} catch (SQLException e) {
				e.printStackTrace();
			}			
			return list;			
		}
		

	private void closeAll(Connection con, PreparedStatement ps, ResultSet rs) {
		try {
			con.close();
			ps.close();
			if(rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	
}
